#pragma GCC optimize(2)
#include <iostream>
#include <queue>
#include <map>
#include <unordered_map>
#include <vector>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <set>
#include <unordered_set>
#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const int N=5e5+10;
int a[N];
int b[N];
int st[N];
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++) scanf("%d",a+i);
	for(int i=1;i<=n;i++) scanf("%d",b+i);
	
	int mmax=0;
	
	for(int i=1;i<=n;i++)
	{
		if(st[i]) continue;
		unordered_map<int,int> last;
		int j=i;
		int len=0;
		while(st[j]==0)
		{
			st[j]+=1; len++;
//			printf("%d %d %d\n",j,a[j],last[a[j]]);
			if(last[a[j]]==0)
			{
				last[a[j]]=len;
			}
			else
			{
				
				mmax=max(mmax,len-last[a[j]]);
				last[a[j]]=len;
			}
			j=b[j];
		}
//		printf("%d\n",len);
		j=i; int len1=0;
		while(st[j]==1)
		{
			st[j]+=1; len1++;
//			printf("%d\n",len-(last[a[j]]-len1));
			if(last[a[j]]>=len1)
			{
				mmax=max(mmax,len-(last[a[j]]-len1));
			}
			last[a[j]]=len1;
			j=b[j];
		}
	}
	cout<<mmax;

	return 0;
}
